package cn.lili.modules.order.cart.render.impl;

import cn.lili.common.utils.CurrencyUtil;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
import cn.lili.modules.order.cart.entity.enums.RenderStepEnums;
import cn.lili.modules.order.cart.entity.vo.CartSkuVO;
import cn.lili.modules.order.cart.entity.vo.CartVO;
import cn.lili.modules.order.cart.render.CartRenderStep;
import cn.lili.modules.order.order.entity.dto.PriceDetailDTO;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 绿色积分抵扣计算
 */
@Service
public class FmoneyPriceRender implements CartRenderStep {

    private final Logger logger = LoggerFactory.getLogger(FmoneyPriceRender.class);

    @Override
    public RenderStepEnums step() {
        return RenderStepEnums.FMONEY_PRICE;
    }

    @Override
    public void render(TradeDTO tradeDTO) {

        init(tradeDTO);

        if(!recount(tradeDTO)) return;

        buildCartPrice(tradeDTO);

        buildTradePrice(tradeDTO);
    }

    // 清空F分计算结果
    private void init(TradeDTO tradeDTO){
        tradeDTO.getCartList().forEach(cartVO -> {
            cartVO.getSkuList().forEach(cartSkuVO -> {
                cartSkuVO.getPriceDetailDTO().setFmoney(0D);
            });
        });

        tradeDTO.getCartList().forEach(cartVO -> {
            cartVO.getPriceDetailDTO().setFmoney(0D);
        });

        tradeDTO.getPriceDetailDTO().setFmoney(0D);
    }

    /**
     * 初始化购物车
     *
     * @param tradeDTO 购物车展示信息
     */
    void buildTradePrice(TradeDTO tradeDTO) {
        tradeDTO.getPriceDetailDTO().accumulationFmoneyPriceDTO(
                tradeDTO.getCartList().stream().map(CartVO::getPriceDetailDTO).toList());
    }

    private void buildCartPrice(TradeDTO tradeDTO){
        tradeDTO.getCartList().forEach(cartVO -> {
            cartVO.getPriceDetailDTO().accumulationFmoneyPriceDTO(
                    cartVO.getSkuList().stream().map(CartSkuVO::getPriceDetailDTO).toList()
            );
        });
    }

    private boolean recount(TradeDTO tradeDTO){
        logger.info("订单数据 {}", JSONObject.toJSONString(tradeDTO));

        // 获取当前抵扣的F分金额
        Double fmoney = tradeDTO.getFmoney();

//        Map<String, Double> cartsMoney = new HashMap<>();

//        Double allF = 0D;
//        Double[] allF = new Double[]{0D};
        // 计算总共有多少F分抵扣在当前购物车当中
//        tradeDTO.getCartList().stream().map(CartVO::getSkuList).flatMap(List::stream).forEach(cartSkuVO -> {
//            logger.info("商品 {}    最大F分 {}", cartSkuVO.getStoreName(), cartSkuVO.getMaxfNumber());
//            logger.info("1商品 {}    最大F分 {}", cartSkuVO.getStoreName(), cartSkuVO.getPriceDetailDTO().getMaxFmoney());
//            Double res = cartSkuVO.getPriceDetailDTO().getMaxFmoney();
//
//            allF[0] = CurrencyUtil.add(allF[0], res == null ? 0D : res);
//
//            cartsMoney.put(cartSkuVO.getGoodsSku().getGoodsId(), res == null ? 0D : res);
//        });
        // 计算总的F分值
//        Double allF = cartsMoney.values().stream().reduce((a, b) -> CurrencyUtil.add(a, b)).get();

//        logger.info("总F分  {}", allF[0]);

        // 如果总共的可抵扣F分为0则直接返回
        logger.info("如果总共的可抵扣F分为0则直接返回 {}", tradeDTO.getPriceDetailDTO().getMaxFmoney().compareTo(0D));
        if(tradeDTO.getPriceDetailDTO().getMaxFmoney().compareTo(0D) == 0) {
            return false;
        }

        logger.info("当前应付分 {}", fmoney);

        // 如果抵扣金额和可抵扣金额一致，则直接填充
        if(tradeDTO.getPriceDetailDTO().getMaxFmoney().compareTo(fmoney) == 0) {
            // 处理每个购物车F分抵扣金额
            tradeDTO.getCartList().forEach(cartVO -> {
                cartVO.getSkuList().forEach(cartSkuVO -> {
                    cartSkuVO.getPriceDetailDTO().setFmoney(cartSkuVO.getPriceDetailDTO().getMaxFmoney());
                });
            });
            return true;
        }

        // 给每个商品增加
        tradeDTO.getCartList().stream().map(CartVO::getSkuList).flatMap(Collection::stream).forEach(cartSkuVO -> {
            cartSkuVO.getPriceDetailDTO().setFmoney(CurrencyUtil.mul(fmoney,
                    CurrencyUtil.div(cartSkuVO.getPriceDetailDTO().getMaxFmoney(),
                            tradeDTO.getPriceDetailDTO().getMaxFmoney())));
        });


        // 确认其中有没有漏掉F分
        Double currFmoney = tradeDTO.getCartList().stream()
                .map(CartVO::getSkuList).flatMap(List::stream)
                .map(CartSkuVO::getPriceDetailDTO).map(PriceDetailDTO::getFmoney).reduce((a, b) -> CurrencyUtil.add(a, b)).get();
        if(currFmoney.compareTo(fmoney) != 0 && tradeDTO.getCartList().size() != 0) {

            List<PriceDetailDTO> list = tradeDTO.getCartList()
                    .stream().map(CartVO::getSkuList).flatMap(List::stream)
                    .map(CartSkuVO::getPriceDetailDTO).toList();

            for(PriceDetailDTO priceDetailDTO : list) {
                if(priceDetailDTO.getFmoney().compareTo(0D) != 0) {
                    priceDetailDTO.setFmoney(CurrencyUtil.add(priceDetailDTO.getFmoney(), CurrencyUtil.sub(fmoney, currFmoney)));
                    break;
                }
            }
        }

        return true;
    }
}
